package aspects;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import validacion.Validador;

public aspect ValidadorSelfModAspect pertarget(instanceCreation()) {

	HashMap<String, List<Validador<?>>> metodosValidados = new HashMap<>(); 

	pointcut instanceCreation():
		execution(dominio.*.new(..));	// CAMBIOS!

	pointcut asignacion(Object objeto, Object valorVariable):
		set (@Monitored * dominio.*.*) && target(objeto) && args(valorVariable);	// CAMBIOS!

	before(Object objeto, Object valorAAsignar): asignacion(objeto,valorAAsignar) {

		String nombreVariable = thisJoinPoint.getSignature().getName();

		if (metodosValidados.containsKey(nombreVariable)) {
			
			for (Validador<?> validador : metodosValidados.get(nombreVariable)) {
				validador.validar(valorAAsignar);
			}

		}

	}

	public interface ConValidador {
	}

	declare parents : dominio.* implements ConValidador;	// CAMBIOS!

	public void ConValidador.agregarValidador(String nombreVariable,
			Validador<?> validador) {

		ValidadorSelfModAspect.aspectOf(this).agregarValidador(nombreVariable,
				validador);
	}

	public void agregarValidador(String nombreVariable,
			Validador<?> validador) {
		
		// CAMBIOS!
		if (! metodosValidados.containsKey(nombreVariable)) {
			metodosValidados.put(nombreVariable,new ArrayList<Validador<?>>());	
		}
		metodosValidados.get(nombreVariable).add(validador);

	}

}